#include "key.app.h"

#define DEBOUNCE_TIME 20 // 消抖时间（ms）
#define LONG_PRESS_TIME 500 // 长按时间阈值（1秒）
#define KEY_NUM 4

// 按键结构体
typedef struct {
    GPIO_TypeDef* port;
    uint16_t pin;
    uint8_t last_level;
    uint8_t pressed_flag;
    uint32_t last_time;
} KeyDebounce;


KeyDebounce keys[KEY_NUM] = {
    {GPIOD, GPIO_PIN_8, 1, 0, 0}, // 按键8
    {GPIOD, GPIO_PIN_9, 1, 0, 0}, // 按键9
    {GPIOD, GPIO_PIN_10, 1, 0, 0}, // 按键10
    {GPIOD, GPIO_PIN_11, 1, 0, 0}  // 按键11
};

static uint8_t pid_chang = 1;//1-Kp 2-ki 3-kd
uint8_t pid_modified = 0;//PID修改标志位 0-未修改，1-修改
uint8_t menu_mode = 0; //菜单模式
uint8_t Pare_chang_Flag = 1; // 1-pid参数修改确认 2-循迹模式


uint8_t key_val = 0;    // 当前按键状态
uint8_t key_old = 0;    // 上次按键状态
uint8_t key_down = 0;   // 按下的按键（事件）
uint8_t key_up = 0;     // 释放的按键（事件）

uint8_t key_read(void) 
{
	uint8_t temp = 0;
	if(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_8) == GPIO_PIN_RESET) temp = 1;
	if(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_9) == GPIO_PIN_RESET) temp = 2;
	if(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_10) == GPIO_PIN_RESET) temp = 3;
	if(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_11) == GPIO_PIN_RESET) temp = 4;
	return temp;
	
}

void key_proc(void) 
{    
    key_val = key_read();
    key_down = key_val & (key_old ^ key_val);
    key_up = ~key_val & (key_old ^ key_val);
    key_old = key_val;


    if (key_down == 1) // 按键8 菜单界面的切换
	{ 
		menu_mode = (menu_mode + 1) % 4;
//		printf("menu_mode:%d\n",menu_mode);

	}
	else if(menu_mode == 1)
	{
		if (key_down == 2) // 按键9（增加参数）
		{ 
			switch (pid_chang) 
			{
				case 1: PID_data_array[1][0] += 1.0f; break;
				case 2: PID_data_array[1][1] += 0.01f; break;
				case 3: PID_data_array[1][2] += 0.01f; break;
				case 4: Round += 1; 
						if(Round == 6) Round = 1;	
				break;
						
			}
			
			pid_modified = 1; // 标记参数已修改（但不自动保存）
		} 
		else if (key_down == 3) // 按键10（减少参数）
		{ 
			switch (pid_chang) 
			{
				case 1: PID_data_array[1][0] -= 1.0f; 
						if(PID_data_array[1][0] < 0)
							PID_data_array[1][0] = 0;

				break;
				case 2: PID_data_array[1][1] -= 0.01f; 
						if(PID_data_array[1][1] < 0)
							PID_data_array[1][1] = 0;

				break;
				case 3: PID_data_array[1][2] -= 0.01f; 
						if(PID_data_array[1][2] < 0)
							PID_data_array[1][2] = 0;
				break;
				case 4: Round -= 1;
						if(Round == 0) Round = 1;
				break;
						

			}
			pid_modified = 1; // 标记参数已修改（但不自动保存）
		} 
		else if (key_down == 4) // 按键11（切换参数类型）
		{ 
				pid_chang++;
				if (pid_chang == 5) pid_chang = 1;
				

		}
	}
	else if(menu_mode == 2) //JY62
	{
		if(key_down == 2)
		{
			switch(pid_chang)
			{
				case 1: PID_data_array[0][0] += 1.0f; break;
				case 2: PID_data_array[0][1] += 0.1f; break;
				case 3: PID_data_array[0][2] += 0.1f; break;				
			}
			pid_modified = 1;
		}
		else if(key_down == 3)
		{
			switch(pid_chang)
			{
				case 1: PID_data_array[0][0] -= 1.0f; break;
				case 2: PID_data_array[0][1] -= 0.1f; break;
				case 3: PID_data_array[0][2] -= 0.1f; break;
			}
			pid_modified = 1;			
		}
		else if (key_down == 4) // 按键11（切换参数类型）
		{ 
				pid_chang++;
				if (pid_chang == 4) pid_chang = 1;				

		}
	}
	else if(menu_mode == 3)
	{
		if(key_down == 2)
		{
			switch(Pare_chang_Flag)
			{
				case 1: 
						W25QXX_SavePIDData();
						pid_modified = 0; // 清除标志
				break;
			}
		}
		else if(key_down == 4)
		{
			Pare_chang_Flag++;
			if(Pare_chang_Flag % 4 == 0)
				Pare_chang_Flag = 1;
		}
	}
		
}

